<?php
namespace GFPHP;
/**
 * Class Hooks                  钩子基础类
 * 钩子使用任何基类,比如Model Controller 但是需要处理要引用包
 * @package GFPHP               框架核心类
 * 用最少的代码做最不可能的事       @PGF
 * Time:2016-01-26 09:16
 */
class Hooks
{
    /**
     * @var array 默认Hooks参数,为框架基础钩子行为,为了正常运行,请勿修改
     */
    public static $Hooks = array(
        //=====实例
//        'F_Router_Start' => array(
//            array(
//                'Hooks' => 'Hooks\F_Core\Router\DirPath',
//                'Func'  => 'begin',
//            ),
//        ),
//        'F_Router_Url' => array(
//            array(
//                'Hooks' => 'Hooks\F_Core\Router\DirPath',
//                'Func'  => 'url',
//            ),
//        ),
//        'F_Router_End' => array(
//            array(
//                'Hooks' => 'Hooks\F_Core\Router\DirPath',
//                'Func'  => 'over',
//            ),
//            array(
//                'Hooks' => 'Hooks\F_Core\Debug\PhpConsole\PhpConsole',
//                'Func'  => 'end',
//            )
//        ),
//        'F_DEBUG'     => array(
//            array(
//                'Hooks' => 'Hooks\F_Core\Debug\PhpConsole\PhpConsole',
//                'Func'  => 'add'
//            ),
//        ),
        'GFPHP_template_parse_start' =>array(
            array(
                'Hooks' => 'Hooks/GFPHP',
                'Func'  => 'template_parse_start'
            ),
        ),
        'GFPHP_template_parse_end' =>array(
            array(
                'Hooks' => 'Hooks/GFPHP',
                'Func'  => 'template_parse_end'
            ),
        ),
    );
    public static $load = array();
    public static function init(){
        self::import(Config::hooks());
    }

    /**
     * @param $name
     * @param array $params
     * @return mixed
     */
    public static function call($name, $params = array()){
        if(isset(self::$Hooks[$name])){
            $act = end(self::$Hooks[$name]);
            if(!isset($act['Hooks'])){
                Debug::add('Hooks: 钩子配置错误,数组必须包含`Hooks`');
            } else {
                $hooks = Loader::Hooks($act['Hooks']);
                $func = isset($act['Func'])?$act['Func']:Config::Hooks('DefaultFunc');
                if(method_exists($hooks, $func)){
                    Debug::add('Hooks: 钩子 ' . $act['Hooks'] . ' 函数 ' . $func . ' 运行.');
                    return call_user_func_array(array($hooks, $func), $params);
                }else{
                    Debug::add('Hooks: 钩子 ' . $act['Hooks'] . ' 函数 ' . $func . ' 没有定义.');
                }
            }
        }
        return FALSE;
    }

    /**
     * @param $name
     * @param array $params
     */
    public static function listen($name, $params = array()){
        if(isset(self::$Hooks[$name])){
            foreach(self::$Hooks[$name] as $act) {
                if (!isset($act['Hooks'])) {
                    Debug::add('Hooks: 钩子配置错误,数组必须包含`Hooks`');
                } else {
                    $hooks = Loader::Hooks($act['Hooks']);
                    $func = isset($act['Func']) ? $act['Func'] : Config::Hooks('DefaultFunc');
                    if (method_exists($hooks, $func)) {
                        Debug::add('Hooks: 钩子 ' . $act['Hooks'] . ' 函数 ' . $func . ' 运行.');
                        call_user_func_array(array($hooks, $func), $params);
                    } else {
                        Debug::add('Hooks: 钩子 ' . $act['Hooks'] . ' 函数 ' . $func . ' 没有定义.');
                    }
                }
            }
        }
    }

    /**
     * @param $name
     * @param $params
     * @return array
     */
    public static function filter($name, $params){
        if(isset(self::$Hooks[$name])){
            foreach(self::$Hooks[$name] as $act) {
                if (!isset($act['Hooks'])) {
                    Debug::add('Hooks: 钩子配置错误,数组必须包含`Hooks`');
                } else {
                    $hooks = Loader::Hooks($act['Hooks']);
                    $func = isset($act['Func']) ? $act['Func'] : Config::Hooks('DefaultFunc');
                    if (method_exists($hooks, $func)) {
                        Debug::add('Hooks: 钩子 ' . $act['Hooks'] . ' 函数 ' . $func . ' 运行.');
                        $res = call_user_func_array(array($hooks, $func), $params);
                        $params = array($res);
                    } else {
                        Debug::add('Hooks: 钩子 ' . $act['Hooks'] . ' 函数 ' . $func . ' 没有定义.');
                    }
                }
            }
        }
        if(count($params)==1)
            return end($params);
        else
            return $params;
    }


    /**
     * @param $HooksName
     * @param $Class
     * @param string $Func
     * @return bool
     */
    public static function add($HooksName, $Class, $Func=''){
        if(!isset(self::$Hooks[$HooksName]))
            self::$Hooks[$HooksName] = array();
        $hooks = array(
            'Hooks' => $Class,
            'Func'  => $Func,
        );
        if(!in_array($hooks, self::$Hooks[$HooksName])){
            self::$Hooks[$HooksName][] = $hooks;
            return true;
        }
        return false;
    }

    /**
     * @param $Hooks
     */
    public static function import($Hooks){
        foreach($Hooks as $k => $v){
            foreach($v as $a) {
                if (!isset($a['Hooks']))
                    continue;
                if (isset($a['Func']))
                    self::add($k, $a['Hooks'], $a['Func']);
            }
        }
    }
}
